Package installing and loading

At first, I install the package animint2 and load it.

if(!requireNamespace("animint2")) install.packages("animint2")
Loading required namespace: animint2
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Warning message:
R graphics engine version 16 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
library(animint2)

Translating plot sketches into ggplots

I will load the dataset WorldBank for visualization

data(WorldBank, package="animint2")
# Remove " (all income levels)" in region field
WorldBank$Region <- sub(" (all income levels)", "", WorldBank$region, fixed=TRUE)
# Plot some final records of the dataset
tail(WorldBank)
# How many rows and columns in this datasets?
dim(WorldBank)
[1] 11342    16
# Filter out records in 1975
WorldBank1975 <- subset(WorldBank, year==1975)
# Plot some early found records in 1975
head(WorldBank1975)
# Plot the relationship between life expectancy and fertility rate of countries in 1975
scatter <- ggplot()+
  geom_point(
    mapping=aes(x=life.expectancy, y=fertility.rate, color=Region),
    data=WorldBank1975)
scatter

animint(scatter)
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(1) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file174316addce93 at http://127.0.0.1:4321

Multi-layer data visualization (multiple geoms)

# This block visualizes the trend of fertility rate and life expectancy between 1970 and 1975
WorldBankBefore1975 <- subset(WorldBank, 1970 <= year & year <= 1975)
two.layers <- scatter+
  geom_path(aes(
    x=life.expectancy,
    y=fertility.rate,
    color=Region,
    group=country),
    data=WorldBankBefore1975)
two.layers

(viz.two.layers <- animint(two.layers))
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(2) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file17431488d5c40 at http://127.0.0.1:3345
viz.two.layers
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(3) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file1743122605383 at http://127.0.0.1:3011
# This command adds the name of countries to the plot as an overlay layer
three.layers <- two.layers+
  geom_text(aes(
    x=life.expectancy,
    y=fertility.rate,
    color=Region,
    label=country),
    data=WorldBank1975)
three.layers

animint(three.layers)
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(4) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file17431486160d0 at http://127.0.0.1:3342

Multi-plot data visualization

# Now we assign a new element named `timeSeries` to visualize the trend of fertility rate over years
viz.two.plots <- viz.two.layers
viz.two.plots$timeSeries <- ggplot()+
  geom_line(aes(
    x=year,
    y=fertility.rate,
    color=Region,
    group=country),
    data=WorldBank)
# After assigned, `viz.two.plots` has two elements: twolayers and timeSeries
summary(viz.two.plots)
           Length Class     Mode
twolayers  9      gganimint list
timeSeries 9      gganimint list
# Draw all the plots
viz.two.plots$twolayers

viz.two.plots$timeSeries

viz.two.plots
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(5) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file1743124c62292 at http://127.0.0.1:4498

Exercise: Using animint to create a data viz with three plots, by creating a list with three ggplots.

# In this exercise, I re-use the above `viz.two.plots` and add a new element named `population` to the end.
# The new element will reveal the changes in population by country.
viz.three.plots <- viz.two.plots
viz.three.plots$population <- ggplot()+
  geom_point(aes(
    x=year,
    y=population,
    color=Region),
    data=WorldBankBefore1975)
# After assigned, `viz.three.plots` has three elements: twolayers and timeSeries
summary(viz.three.plots)
           Length Class     Mode
twolayers  9      gganimint list
timeSeries 9      gganimint list
population 9      gganimint list
# Draw all the plots
viz.three.plots$twolayers

viz.three.plots$timeSeries

viz.three.plots$population

viz.three.plots
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(6) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file1743168384f49 at http://127.0.0.1:5156

Multi-panel data visualization (facets)

Different geoms in each panel (aligned axes)

# In case we want to make the same y-axis for all plots
add.x.var <- function(df, x.var){
  data.frame(df, x.var=factor(x.var, c("life expectancy", "year")))
}
(viz.aligned <- animint(
  scatter=ggplot()+
    theme_animint(width=1000)+
    geom_point(aes(x=life.expectancy, y=fertility.rate, color=Region),
               data=add.x.var(WorldBank1975, "life expectancy"))+
    geom_path(aes(x=life.expectancy, y=fertility.rate, color=Region,
                  group=country),
              data=add.x.var(WorldBankBefore1975, "life expectancy"))+
    geom_line(aes(x=year, y=fertility.rate, color=Region, group=country),
              data=add.x.var(WorldBank, "year"))+
    xlab("")+
    facet_grid(. ~ x.var, scales="free")+
    theme_bw()+
    theme(panel.margin=grid::unit(0, "lines"))
  ))
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(7) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file1743175c4d729 at http://127.0.0.1:6019
viz.aligned$scatter

Same geoms in each panel (compare data subsets)

# I create a table that contains data in three years: 1975, 1985, 1995
show.point.list <- list()
show.path.list <- list()
for(show.year in c(1975, 1985, 1995)){
  show.point.list[[paste(show.year)]] <- data.frame(
    show.year, subset(WorldBank, year==show.year))
  show.path.list[[paste(show.year)]] <- data.frame(
    show.year, subset(WorldBank, show.year - 5 <= year & year <= show.year))
}
show.point <- do.call(rbind, show.point.list)
show.path <- do.call(rbind, show.path.list)
# Now we will visualize the relationship between fertility rate and life expectancy in (1970-1975), (1980-1985), and (1990-1995).
viz.panels <- list(
  scatter=ggplot()+
    geom_point(aes(x=life.expectancy, y=fertility.rate, color=Region),
               data=show.point)+
    geom_path(aes(x=life.expectancy, y=fertility.rate, color=Region,
                  group=country),
              data=show.path)+
    facet_grid(. ~ show.year)+
    theme_bw()+
    theme(panel.margin=grid::unit(0, "lines"))
  )
viz.panels$scatter

structure(viz.panels, class="animint")
Saving animint in temporary directory; specify output directory using animint(out.dir="path/to/directory")
To stop the server, run servr::daemon_stop(8) or restart your R session
Serving the directory /private/var/folders/ny/0zb_vjr53qqb_svqhxcprhtw0000gn/T/RtmpDmhYLw/file174312c61fdc2 at http://127.0.0.1:3703
LS0tCnRpdGxlOiAiQW5pbWludDIgLSBDaGFwdGVyIDIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyBQYWNrYWdlIGluc3RhbGxpbmcgYW5kIGxvYWRpbmcKQXQgZmlyc3QsIEkgaW5zdGFsbCB0aGUgcGFja2FnZSBgYW5pbWludDJgIGFuZCBsb2FkIGl0LgpgYGB7cn0KaWYoIXJlcXVpcmVOYW1lc3BhY2UoImFuaW1pbnQyIikpIGluc3RhbGwucGFja2FnZXMoImFuaW1pbnQyIikKbGlicmFyeShhbmltaW50MikKYGBgCgoKIyBUcmFuc2xhdGluZyBwbG90IHNrZXRjaGVzIGludG8gZ2dwbG90cwpJIHdpbGwgbG9hZCB0aGUgZGF0YXNldCBXb3JsZEJhbmsgZm9yIHZpc3VhbGl6YXRpb24KYGBge3J9CmRhdGEoV29ybGRCYW5rLCBwYWNrYWdlPSJhbmltaW50MiIpCiMgUmVtb3ZlICIgKGFsbCBpbmNvbWUgbGV2ZWxzKSIgaW4gcmVnaW9uIGZpZWxkCldvcmxkQmFuayRSZWdpb24gPC0gc3ViKCIgKGFsbCBpbmNvbWUgbGV2ZWxzKSIsICIiLCBXb3JsZEJhbmskcmVnaW9uLCBmaXhlZD1UUlVFKQojIFBsb3Qgc29tZSBmaW5hbCByZWNvcmRzIG9mIHRoZSBkYXRhc2V0CnRhaWwoV29ybGRCYW5rKQpgYGAKCmBgYHtyfQojIEhvdyBtYW55IHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhpcyBkYXRhc2V0cz8KZGltKFdvcmxkQmFuaykKYGBgCgoKYGBge3J9CiMgRmlsdGVyIG91dCByZWNvcmRzIGluIDE5NzUKV29ybGRCYW5rMTk3NSA8LSBzdWJzZXQoV29ybGRCYW5rLCB5ZWFyPT0xOTc1KQojIFBsb3Qgc29tZSBlYXJseSBmb3VuZCByZWNvcmRzIGluIDE5NzUKaGVhZChXb3JsZEJhbmsxOTc1KQpgYGAKCmBgYHtyfQojIFBsb3QgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxpZmUgZXhwZWN0YW5jeSBhbmQgZmVydGlsaXR5IHJhdGUgb2YgY291bnRyaWVzIGluIDE5NzUKc2NhdHRlciA8LSBnZ3Bsb3QoKSsKICBnZW9tX3BvaW50KAogICAgbWFwcGluZz1hZXMoeD1saWZlLmV4cGVjdGFuY3ksIHk9ZmVydGlsaXR5LnJhdGUsIGNvbG9yPVJlZ2lvbiksCiAgICBkYXRhPVdvcmxkQmFuazE5NzUpCgpzY2F0dGVyCmFuaW1pbnQoc2NhdHRlcikKYGBgCgojIE11bHRpLWxheWVyIGRhdGEgdmlzdWFsaXphdGlvbiAobXVsdGlwbGUgZ2VvbXMpCmBgYHtyfQojIFRoaXMgYmxvY2sgdmlzdWFsaXplcyB0aGUgdHJlbmQgb2YgZmVydGlsaXR5IHJhdGUgYW5kIGxpZmUgZXhwZWN0YW5jeSBiZXR3ZWVuIDE5NzAgYW5kIDE5NzUKV29ybGRCYW5rQmVmb3JlMTk3NSA8LSBzdWJzZXQoV29ybGRCYW5rLCAxOTcwIDw9IHllYXIgJiB5ZWFyIDw9IDE5NzUpCnR3by5sYXllcnMgPC0gc2NhdHRlcisKICBnZW9tX3BhdGgoYWVzKAogICAgeD1saWZlLmV4cGVjdGFuY3ksCiAgICB5PWZlcnRpbGl0eS5yYXRlLAogICAgY29sb3I9UmVnaW9uLAogICAgZ3JvdXA9Y291bnRyeSksCiAgICBkYXRhPVdvcmxkQmFua0JlZm9yZTE5NzUpCgp0d28ubGF5ZXJzCgoodml6LnR3by5sYXllcnMgPC0gYW5pbWludCh0d28ubGF5ZXJzKSkKdml6LnR3by5sYXllcnMKYGBgCgpgYGB7cn0KIyBUaGlzIGNvbW1hbmQgYWRkcyB0aGUgbmFtZSBvZiBjb3VudHJpZXMgdG8gdGhlIHBsb3QgYXMgYW4gb3ZlcmxheSBsYXllcgp0aHJlZS5sYXllcnMgPC0gdHdvLmxheWVycysKICBnZW9tX3RleHQoYWVzKAogICAgeD1saWZlLmV4cGVjdGFuY3ksCiAgICB5PWZlcnRpbGl0eS5yYXRlLAogICAgY29sb3I9UmVnaW9uLAogICAgbGFiZWw9Y291bnRyeSksCiAgICBkYXRhPVdvcmxkQmFuazE5NzUpCgp0aHJlZS5sYXllcnMKYW5pbWludCh0aHJlZS5sYXllcnMpCmBgYAoKIyBNdWx0aS1wbG90IGRhdGEgdmlzdWFsaXphdGlvbgoKYGBge3J9CiMgTm93IHdlIGFzc2lnbiBhIG5ldyBlbGVtZW50IG5hbWVkIGB0aW1lU2VyaWVzYCB0byB2aXN1YWxpemUgdGhlIHRyZW5kIG9mIGZlcnRpbGl0eSByYXRlIG92ZXIgeWVhcnMKdml6LnR3by5wbG90cyA8LSB2aXoudHdvLmxheWVycwp2aXoudHdvLnBsb3RzJHRpbWVTZXJpZXMgPC0gZ2dwbG90KCkrCiAgZ2VvbV9saW5lKGFlcygKICAgIHg9eWVhciwKICAgIHk9ZmVydGlsaXR5LnJhdGUsCiAgICBjb2xvcj1SZWdpb24sCiAgICBncm91cD1jb3VudHJ5KSwKICAgIGRhdGE9V29ybGRCYW5rKQpgYGAKCmBgYHtyfQojIEFmdGVyIGFzc2lnbmVkLCBgdml6LnR3by5wbG90c2AgaGFzIHR3byBlbGVtZW50czogdHdvbGF5ZXJzIGFuZCB0aW1lU2VyaWVzCnN1bW1hcnkodml6LnR3by5wbG90cykKYGBgCgpgYGB7cn0KIyBEcmF3IGFsbCB0aGUgcGxvdHMKdml6LnR3by5wbG90cyR0d29sYXllcnMKdml6LnR3by5wbG90cyR0aW1lU2VyaWVzCgp2aXoudHdvLnBsb3RzCmBgYAoKIyBFeGVyY2lzZTogVXNpbmcgYW5pbWludCB0byBjcmVhdGUgYSBkYXRhIHZpeiB3aXRoIHRocmVlIHBsb3RzLCBieSBjcmVhdGluZyBhIGxpc3Qgd2l0aCB0aHJlZSBnZ3Bsb3RzLgoKYGBge3J9CiMgSW4gdGhpcyBleGVyY2lzZSwgSSByZS11c2UgdGhlIGFib3ZlIGB2aXoudHdvLnBsb3RzYCBhbmQgYWRkIGEgbmV3IGVsZW1lbnQgbmFtZWQgYHBvcHVsYXRpb25gIHRvIHRoZSBlbmQuCiMgVGhlIG5ldyBlbGVtZW50IHdpbGwgcmV2ZWFsIHRoZSBjaGFuZ2VzIGluIHBvcHVsYXRpb24gYnkgY291bnRyeS4Kdml6LnRocmVlLnBsb3RzIDwtIHZpei50d28ucGxvdHMKdml6LnRocmVlLnBsb3RzJHBvcHVsYXRpb24gPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4PXllYXIsCiAgICB5PXBvcHVsYXRpb24sCiAgICBjb2xvcj1SZWdpb24pLAogICAgZGF0YT1Xb3JsZEJhbmtCZWZvcmUxOTc1KQpgYGAKCmBgYHtyfQojIEFmdGVyIGFzc2lnbmVkLCBgdml6LnRocmVlLnBsb3RzYCBoYXMgdGhyZWUgZWxlbWVudHM6IHR3b2xheWVycyBhbmQgdGltZVNlcmllcwpzdW1tYXJ5KHZpei50aHJlZS5wbG90cykKYGBgCgpgYGB7cn0KIyBEcmF3IGFsbCB0aGUgcGxvdHMKdml6LnRocmVlLnBsb3RzJHR3b2xheWVycwp2aXoudGhyZWUucGxvdHMkdGltZVNlcmllcwp2aXoudGhyZWUucGxvdHMkcG9wdWxhdGlvbgoKdml6LnRocmVlLnBsb3RzCmBgYAoKIyBNdWx0aS1wYW5lbCBkYXRhIHZpc3VhbGl6YXRpb24gKGZhY2V0cykKIyMgRGlmZmVyZW50IGdlb21zIGluIGVhY2ggcGFuZWwgKGFsaWduZWQgYXhlcykKCmBgYHtyfQojIEluIGNhc2Ugd2Ugd2FudCB0byBtYWtlIHRoZSBzYW1lIHktYXhpcyBmb3IgYWxsIHBsb3RzCmFkZC54LnZhciA8LSBmdW5jdGlvbihkZiwgeC52YXIpewogIGRhdGEuZnJhbWUoZGYsIHgudmFyPWZhY3Rvcih4LnZhciwgYygibGlmZSBleHBlY3RhbmN5IiwgInllYXIiKSkpCn0KKHZpei5hbGlnbmVkIDwtIGFuaW1pbnQoCiAgc2NhdHRlcj1nZ3Bsb3QoKSsKICAgIHRoZW1lX2FuaW1pbnQod2lkdGg9MTAwMCkrCiAgICBnZW9tX3BvaW50KGFlcyh4PWxpZmUuZXhwZWN0YW5jeSwgeT1mZXJ0aWxpdHkucmF0ZSwgY29sb3I9UmVnaW9uKSwKICAgICAgICAgICAgICAgZGF0YT1hZGQueC52YXIoV29ybGRCYW5rMTk3NSwgImxpZmUgZXhwZWN0YW5jeSIpKSsKICAgIGdlb21fcGF0aChhZXMoeD1saWZlLmV4cGVjdGFuY3ksIHk9ZmVydGlsaXR5LnJhdGUsIGNvbG9yPVJlZ2lvbiwKICAgICAgICAgICAgICAgICAgZ3JvdXA9Y291bnRyeSksCiAgICAgICAgICAgICAgZGF0YT1hZGQueC52YXIoV29ybGRCYW5rQmVmb3JlMTk3NSwgImxpZmUgZXhwZWN0YW5jeSIpKSsKICAgIGdlb21fbGluZShhZXMoeD15ZWFyLCB5PWZlcnRpbGl0eS5yYXRlLCBjb2xvcj1SZWdpb24sIGdyb3VwPWNvdW50cnkpLAogICAgICAgICAgICAgIGRhdGE9YWRkLngudmFyKFdvcmxkQmFuaywgInllYXIiKSkrCiAgICB4bGFiKCIiKSsKICAgIGZhY2V0X2dyaWQoLiB+IHgudmFyLCBzY2FsZXM9ImZyZWUiKSsKICAgIHRoZW1lX2J3KCkrCiAgICB0aGVtZShwYW5lbC5tYXJnaW49Z3JpZDo6dW5pdCgwLCAibGluZXMiKSkKICApKQoKdml6LmFsaWduZWQkc2NhdHRlcgpgYGAKCiMjIFNhbWUgZ2VvbXMgaW4gZWFjaCBwYW5lbCAoY29tcGFyZSBkYXRhIHN1YnNldHMpCmBgYHtyfQojIEkgY3JlYXRlIGEgdGFibGUgdGhhdCBjb250YWlucyBkYXRhIGluIHRocmVlIHllYXJzOiAxOTc1LCAxOTg1LCAxOTk1CnNob3cucG9pbnQubGlzdCA8LSBsaXN0KCkKc2hvdy5wYXRoLmxpc3QgPC0gbGlzdCgpCmZvcihzaG93LnllYXIgaW4gYygxOTc1LCAxOTg1LCAxOTk1KSl7CiAgc2hvdy5wb2ludC5saXN0W1twYXN0ZShzaG93LnllYXIpXV0gPC0gZGF0YS5mcmFtZSgKICAgIHNob3cueWVhciwgc3Vic2V0KFdvcmxkQmFuaywgeWVhcj09c2hvdy55ZWFyKSkKICBzaG93LnBhdGgubGlzdFtbcGFzdGUoc2hvdy55ZWFyKV1dIDwtIGRhdGEuZnJhbWUoCiAgICBzaG93LnllYXIsIHN1YnNldChXb3JsZEJhbmssIHNob3cueWVhciAtIDUgPD0geWVhciAmIHllYXIgPD0gc2hvdy55ZWFyKSkKfQpzaG93LnBvaW50IDwtIGRvLmNhbGwocmJpbmQsIHNob3cucG9pbnQubGlzdCkKc2hvdy5wYXRoIDwtIGRvLmNhbGwocmJpbmQsIHNob3cucGF0aC5saXN0KQpgYGAKCmBgYHtyfQojIE5vdyB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZmVydGlsaXR5IHJhdGUgYW5kIGxpZmUgZXhwZWN0YW5jeSBpbiAoMTk3MC0xOTc1KSwgKDE5ODAtMTk4NSksIGFuZCAoMTk5MC0xOTk1KS4Kdml6LnBhbmVscyA8LSBsaXN0KAogIHNjYXR0ZXI9Z2dwbG90KCkrCiAgICBnZW9tX3BvaW50KGFlcyh4PWxpZmUuZXhwZWN0YW5jeSwgeT1mZXJ0aWxpdHkucmF0ZSwgY29sb3I9UmVnaW9uKSwKICAgICAgICAgICAgICAgZGF0YT1zaG93LnBvaW50KSsKICAgIGdlb21fcGF0aChhZXMoeD1saWZlLmV4cGVjdGFuY3ksIHk9ZmVydGlsaXR5LnJhdGUsIGNvbG9yPVJlZ2lvbiwKICAgICAgICAgICAgICAgICAgZ3JvdXA9Y291bnRyeSksCiAgICAgICAgICAgICAgZGF0YT1zaG93LnBhdGgpKwogICAgZmFjZXRfZ3JpZCguIH4gc2hvdy55ZWFyKSsKICAgIHRoZW1lX2J3KCkrCiAgICB0aGVtZShwYW5lbC5tYXJnaW49Z3JpZDo6dW5pdCgwLCAibGluZXMiKSkKICApCgp2aXoucGFuZWxzJHNjYXR0ZXIKc3RydWN0dXJlKHZpei5wYW5lbHMsIGNsYXNzPSJhbmltaW50IikKYGBgCgo=